package ;
import flash.events.FocusEvent;
import flixel.addons.display.FlxBackdrop;
import flixel.addons.tile.FlxTilemapExt;
import flixel.group.FlxGroup;
import flixel.group.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.FlxSprite;
import PatronTileMap;
import flixel.util.FlxRandom;
import flixel.FlxG;
import haxe.xml.Fast;
import haxe.xml.Parser;
import openfl.Assets;
import items.Pill;

/**
 * ...
 * @author Federico Donnet
 */

class Level extends FlxTypedGroup<PatronTileMap>
{
	//--------------------------------------------------------------------------------//
	//---*Atributos:
	//--------------------------------------------------------------------------------//
	//---*"Distancia" entre cada tileMapExt:
	public	var distance:Int						=	320;
	//---*Velocidad del Level:
	public	var	velocity:Float						=	600;
	//---*Array de todos los TMX del level:
	public	var	patronsTMXs:Array<String>   		=	null;
	// lista de todos los items:
	public	var	itemList(default, null): FlxGroup	=	null;
	//---*Referencia del cameraSprite:
	public	var cameraSprite: FlxSprite				=	null;
	//---*Background:
	private	var	background:FlxBackdrop				=	null;
	
	// grupos de items específicos
	private var _pills: FlxTypedGroup<Pill>			=	null;


	var patronA:Int 								=	0;
	var patronB:Int 								=	0;
	var patronC:Int 								=	0;
	//--------------------------------------------------------------------------------//
	//---*Metodos:
	//--------------------------------------------------------------------------------//
	public function new() 
	{
		super();				
	}
	//---*Init Callback de la clase:
	public	function Init(levelName:String)
	{		
		var index:Int 								=	0;
		var tmxData:Dynamic							=	"";		
		this.patronsTMXs							=	new Array<String>();
		
		
		
		//---*Leemos el TMX de los Levels y buscamos los patrones del level a "cargar" (es decir, el del levelName):
		patronsTMXs 								=	Utils.ReadXML(Utils.LEVELMANAGERTMX, levelName);		
		
		// items
		itemList 									=	new FlxGroup();
		//_pills = new FlxTypedGroup<Pill>();
		//itemList.add(_pills);
		
		//---*Pool de PatronTileMap:
		index = 0;
		
		while (index < this.patronsTMXs.length)
		{
			
			this.add(new PatronTileMap(this.patronsTMXs[index]));			
			index += 1;
		}
		
		//---*Configuramos algunas propiedades de los miembros del grupo (tileMapExt):	
		index = 0;
		while (index < this.members.length)
		{			
			this.members[index].level 					=	this;
			//---*Indicamos que si se va a mover el tileMapExt (aunque sigue siendo inmovible):
			//this.members[index].moves 				=	true;
			this.members[index].GenerateTileMap(Utils.TILESET_01);
			this.members[index].Activate(false);
			this.members[index].setPosition(this.distance * index, 0);			
			//this.members[index].velocity.x 			=	-this.velocity;
			index 										+=	1;
		}			
				
		//---*Como es el Init, activamos el primer patron:
		this.members[patronA].Activate(true);
		this.members[patronA].setPosition(this.distance * 0, 0);
		this.members[patronA].activeIndex = 1;
		
		//---*Ahora pedimos una conexion del patron anterior:
		var n:Int = this.members[this.patronA].GetRandomConection();
		while (this.members[n].active)
		{
			n = this.members[this.patronA].GetRandomConection();
		}
		patronB 	=	n;
		this.members[patronB].Activate(true);
		this.members[patronB].setPosition(this.distance * 1, 0);
		this.members[patronB].activeIndex = 2;
		
		//---*Ahora pedimos una conexion del patron anterior:
		while (this.members[n].active)
		{
			n = this.members[this.patronB].GetRandomConection();
		}
		patronC 	=	n;
		this.members[patronC].Activate(true);
		this.members[patronC].setPosition(this.distance * 2, 0);
		this.members[patronC].activeIndex = 3;
		
		
		//---*Setea limites a la camera, por lo general, el tamaño de un patronTileMap, por eso se le da el primero:
		FlxG.camera.setBounds(0, 0, Math.POSITIVE_INFINITY, this.members[0].heightInPixels);
		//---*Fixeamos el tamaño del mundo ya que al cargar los tileMapExt le hacen creer que el tamaño es solo el de 1 patron:
		FlxG.worldBounds.width = 3 * this.distance;
		
		//---*Background:
		this.background								=	new	FlxBackdrop("assets/images/background.png", 1, 0, true, true);
		this.background.scrollFactor.x				=	0.6;		
		
		FlxG.state.add(this.background);
		
		
	}
		
	
	
	//---*Detiene (setea la velocidad en eje X a 0) el movimiento de todos los patronTileMap:
	public	function Stop():Void
	{				
		var index:Int 		=	0;
		while (index < this.members.length)
		{			
			this.members[index].velocity.x			=	0;		
			index += 1;
		}
	}
	//---*Activa un item en la posicion dada:
	public	function addItem(X:Float, Y:Float, ItemType: String):Void
	{
		trace("LOOOOOOOOOOL");
		switch(ItemType)
		{
			case "Pill":
				//var pill = _pills.recycle();
				//pill.reset(X, Y);
			case "Spikes":

			default:
				trace("No se que hacer con el tipo de item: " + ItemType);

		}
	}
	
	
	
	public	function Change():Void
	{
		
		var Index:Int = 0;
		this.members[this.patronA].Activate(false);
		this.members[this.patronB].Activate(false);
		this.members[this.patronC].x = 0;
		
		//---*El patron A ahora es el C:
		this.patronA = this.patronC;
		//---*Activa "2 nuevos" patrones, es decir el B y el C:
		
		var n:Int = this.members[this.patronA].GetRandomConection();
		while (this.members[n].active)
		{
			n = this.members[this.patronA].GetRandomConection();
		}		
		this.patronB = n;
		this.members[this.patronB].Activate(true);
		this.members[this.patronB].x = this.distance;	
				
		while (this.members[n].active)
		{
			n = this.members[this.patronB].GetRandomConection();
		}		
		this.patronC = n;
		this.members[this.patronC].Activate(true);
		this.members[this.patronC].x = this.distance * 2;	
		
		this.background.x -= 640 * this.background.scrollFactor.x;
		
	}
	
}